
package com.monlyu.util;

import org.apache.commons.lang.StringUtils;

/**
 * org.apache.commons.lang StringUtils 的扩展类
 * 
 * @author monlyu
 */
public class StringUtil {

    private static String source = "我是标题我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文我是正文"
        + "我是第二段我是第二段我是第二段我是第二段我是第二段我是第二段我是第二段我是第二段我是第二段我是第二段我是第二段我是第二段我是第二段我是第二段我是第二段我是第二段我是第二段我是第二段我是第二段我是第二段我是第二段我是第二段我是第二段我是第二段我是第二段我是第二段我是第二段我是第二段我是第二段我是第二段我是第二段我是第二段我是第二段我是第二段我是第二段我是第二段我是第二段我是第二段我是第二段我是第二段我是第二段我是第二段我是第二段我是第二段我是第二段";

    private static String desc = "我是标题党我这是正文";

    /** 用于标记字符串比较，红色加中划线-删除，蓝色-增加 */
    private static String add = "<font color='#3377AA'>";
    private static String delete = "<s><font color='#FF0000'>";
    private static String addEnd = "</font>";
    private static String deleteEnd = "</font></s>";

    /** 小段内容比较的最大长度 */
    private static int max = 10;

    /**
     * 按段落来比较两段字符串
     * 
     * @param src
     * @param desc
     * @return
     * @since chendan 2010-3-27
     */
    public static String compStringByP(String src, String desc){
        String[] srcs = src.split("<p>");
        String[] descs = desc.split("<p>");
        StringBuilder res = new StringBuilder();
        int i = 0, j = 0;
        for (; i < srcs.length && j < descs.length;) {
            res.append(compare(srcs[i], descs[j]) + "<p>");
            i++;
            j++;
        }
        if (i >= srcs.length) {
            res.append(add);
            for (int t = j; t < descs.length; t++) {
                res.append(descs[t] + "<p>");
            }
            res.append(addEnd);
        } else if (j >= desc.length()) {
            res.append(delete);
            for (int t = i; t < srcs.length; t++) {
                res.append(srcs[t] + "<p>");
            }
            res.append(deleteEnd);
        }
        return res.toString();
    }

    /**
     * 直接比较两段的内容
     * 
     * @param src
     * @param desc
     * @return
     * @since chendan 2010-3-27
     */
    public static String compare(String src, String desc){
        StringBuilder res = new StringBuilder();
        int i = 0, j = 0;
        for (; i < src.length() && j < desc.length();) {
            // 相等，则直接记入res
            if (src.charAt(i) == desc.charAt(j)) {
                res.append(src.charAt(i));
                i++;
                j++;
            } else {
                boolean flag = false;
                // 先走desc,直到相等为止，如果走5个，还不等，换另外一条
                for (int t = 1; t <= max; t++) {
                    if (j + t < desc.length() && src.charAt(i) == desc.charAt(j + t)) {
                        res.append(add + desc.substring(j, j + t) + addEnd + src.charAt(i));
                        flag = true;
                        j += t + 1;
                        i++;
                        break;
                    }
                }
                if (!flag) {
                    // desc走5个还没找到相等的，就走src，走5个，如果还不等，再换另外一条
                    for (int t = 1; t <= max; t++) {
                        if (i + t < src.length() && src.charAt(i + t) == desc.charAt(j)) {
                            res.append(delete + src.substring(i, i + t) + deleteEnd + desc.charAt(j));
                            flag = true;
                            i += t + 1;
                            j++;
                            break;
                        }
                    }
                }
                // 如果两边都不等，则认为是desc中删除了src(i)，并增加了desc(j)
                if (!flag) {
                    res.append(delete + src.charAt(i) + deleteEnd + add + desc.charAt(j) + addEnd);
                    i++;
                    j++;
                }
            }
        }
        if (i >= src.length()) {
            res.append(add + desc.substring(j, desc.length()) + addEnd);
        } else if (j >= desc.length()) {
            res.append(delete + src.substring(i, src.length()) + deleteEnd);
        }
        return res.toString();
    }

    /**
     * 判断一个对象是否为空
     * 
     * @since 2009-12-28
     */
    public static boolean isEmpty(Object obj){
        return StringUtils.isEmpty(obj == null ? null : obj.toString());
    }

    /**
     * 如果str为空，则返回空字符串，否则trim之后返回
     */
    public static String killNull(Object str){
        return killNull(str, "");
    }

    /**
     * 如果str为空，则返回字符串defaultStr，否则trim之后返回
     * 
     * @param str
     * @param defaultStr
     */
    public static String killNull(Object str, String defaultStr){
        if (isEmpty(str)) {
            return defaultStr;
        }
        return str.toString().trim();
    }

    /**
     * 不为空
     */
    public static boolean isNotEmpty(Object obj){
        return !StringUtil.isEmpty(obj);
    }

    /**
     * 本方法是判断有个字符串是否为空.包含 空白
     * 
     * @since 2009-12-29
     */
    public static boolean isTrimEmpty(Object obj){
        return StringUtil.isEmpty(obj) || StringUtils.isBlank(obj.toString());
    }

    /**
     * 输出首字母大写
     * 
     * @since 2009-12-28
     */
    public static String capFisrtChar(String input){
        if (StringUtil.isEmpty(input)) {
            return null;
        }
        if (input.length() < 2) {
            return Character.toUpperCase(input.charAt(0)) + "";
        }
        return Character.toUpperCase(input.charAt(0)) + input.substring(1);
    }

    /**
     * 前向后截取长度为i的字符串
     */
    public static Object shot(String input, int i){
        if (input.length() <= i) {
            return input;
        } else {
            return input.substring(0, i);
        }
    }

    /**
     * 去除字符串的空白
     * 
     * @since 2010-1-12
     */
    public static String trim(String src){
        return StringUtil.trim(src, "");
    }

    public static String trim(Object src){
        if (src == null) {
            return "";
        }
        return trim(src.toString());
    }

    /**
     * 去除字符串的空格,如果为;null则用默认字符串代替
     * 
     * @since 2010-1-14
     */
    public static String trim(String src, String deflt){
        if (StringUtil.isTrimEmpty(src)) {
            return deflt;
        }
        return src.trim();
    }

    /** 把文件的明转化为字符串 */
    public static String str2Iso8859_1(String name){
        try {
            return new String(name.getBytes(), "ISO8859-1");
        }
        catch (Exception e) {
            return DateUtil.format(DateUtil.now()) + FileUtil.fileExtens(name);
        }
    }

    public static String eclipse(String input, int length){
        if (StringUtil.isEmpty(input) || input.length() <= length) {
            return input;
        } else {
            return input.substring(0, length);
        }
    }

    // 默认10字符
    public static String eclipse(String title){
        return eclipse(title, 10);
    }
    
    public static String path2Uri(String path){
        return path.replaceAll("\\\\", "\\/").replaceAll("\\/\\/", "\\/");
    }
}
